from django.contrib.auth import get_user_model
from django.db import models, IntegrityError
from django.db.models import ForeignKey
from mptt.models import MPTTModel, TreeForeignKey
# MPTT(Modified Pre-order Traversal Tree)
# 参考资料： https://www.jianshu.com/p/09e24579a707
# https://django-mptt.readthedocs.io/en/latest/install.html

from blog.models import Post

User = get_user_model()


# class Comment(models.Model):
class Comment(MPTTModel):
    """文章评论模型"""
    post = models.ForeignKey(Post, verbose_name='文章', on_delete=models.CASCADE)

    user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)

    content = models.TextField('内容')
    # auto_now_add=True，创建的时候添加时间，不可以修改
    date_created = models.DateTimeField(auto_now_add=True)

    # 使用slug隐藏评论ID
    # blank=True表单填写时可以为空，用户保存时自动生成uuid保存到数据库
    # (重写save方法)
    # 使用随机字符串作为slug，并且是唯一的，设置为8个字符(get_random_string)
    # 如果出现唯一性错误时，使用uuid生成唯一slug，因此这里设置slug字段最大长度为32个字符
    slug = models.CharField(max_length=32, unique=True, blank=True)

    # 父评论
    parent = TreeForeignKey(
        'self',
        null=True,
        blank=True,
        related_name='children',
        on_delete=models.CASCADE,
    )

    # 恢复给谁
    reply_to = ForeignKey(
        User,
        null=True,
        blank=True,
        related_name='replies',
        on_delete=models.CASCADE,
    )

    class Meta:
        verbose_name = verbose_name_plural = '评论'
    #     ordering = ('-created_date', '-id')

    class MPTTMeta:
        verbose_name = verbose_name_plural = '评论'
        order_insertion_by = ('-date_created',)

    def __str__(self):
        return self.content[:15]

    def save(self, *args, **kwargs):

        # 在信号中使用get_random_string函数生成12位的slug，如果出现重复，调用
        # save方法时会抛出IntegrityError（唯一性错误），这时使用uuid生成32位slug
        # 它的值永远是唯一的
        try:
            super().save(*args, **kwargs)
        except IntegrityError:
            import uuid
            self.slug = uuid.uuid4().hex
            super().save(*args, **kwargs)
